package com.qdlc.p2p.dal.model;

import java.util.Date;

import org.springframework.beans.BeanUtils;

import com.qdlc.p2p.common.enums.EnumActicityPlanNid;
import com.qdlc.p2p.common.exception.UserException;
import com.qdlc.p2p.common.util.BeanUtil;
import com.qdlc.p2p.common.util.DataUtils;
import com.qdlc.p2p.common.util.MessageUtil;
import com.qdlc.p2p.common.util.StringUtil;
import com.qdlc.p2p.common.util.ValidateUtil;
import com.qdlc.p2p.dal.dao.UserDao;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.dto.UserWineCoupons;

/**
 * 用户酒券获取记录 Model
 * @author ygw
 * @version 1.1.0.0
 * @date 2016年5月6日 下午2:56:41
 */
public class UserWineCouponsModel extends UserWineCoupons {

	/********** 常量 start *************/
	
	/**
	 * 用户酒券状态：未使用
	 */
	public static final byte USER_WINE_COUPONS_STATUS_NO_USE = 0;
	
	/**
	 * 用户酒券状态：已使用
	 */
	public static final byte USER_WINE_COUPONS_STATUS_USE = 1;
	
	/**
	 * 用户酒券状态：已过期
	 */
	public static final byte USER_WINE_COUPONS_STATUS_EXPIRED = 2;
	
	/**
	 * 用户酒券状态：无效
	 */
	public static final byte USER_WINE_COUPONS_STATUS_INVALID = 3;
	
	/**
	 * 用户酒券状态：冻结 已使用但尚未正式被扣除
	 */
	public static final byte USER_WINE_COUPONS_STATUS_FREEZE = 4;
	
	/**
	 * 酒券类型：现金酒券
	 */
	public static final byte USER_WINE_COUPONS_TYPE_CASH = 1;

	/**
	 * 酒券类型：虚拟酒券
	 */
	public static final byte USER_WINE_COUPONS_TYPE_VIRTUAL = 2;
	
	/**
	 * 酒券使用：投资借款标
	 */
	public static final String USE_BORROW_TENDER = "borrow_tender";
	
	/**
	 * 酒券使用：兑换金额
	 */
	public static final String USE_EXCHANGE_AMOUNT = "exchange_amount";
	
	/********** 常量 end *************/

	/**
	 * 酒券ID
	 */
	private int wineCouponsId;

	public int getWineCouponsId() {
		return wineCouponsId;
	}

	public void setWineCouponsId(int wineCouponsId) {
		this.wineCouponsId = wineCouponsId;
	}

	/**
	 * 当前页数
	 */
	private int page = 1;

	/**
	 * 每页总数
	 */
	private int rows = 5;
	
	/**
	 * 搜索条件（用户名/真实姓名）
	 */
	private String searchName;

	/**
	 * 用户ID
	 */
	private long userId;
	
	/**
	 * 用户名
	 */
	private String userName;
	
	/**
	 * 真实姓名
	 */
	private String realName;
	
	/**
	 * 获取开始时间
	 */
	private String startTime;
	
	private Date startDate;
	
	/**
	 * 获取结束时间
	 */
	private String endTime;
	
	private Date endDate;
	
	/**
	 * 使用开始时间
	 */
	private String useStartTime;
	
	private Date useStartDate;
	
	/**
	 * 使用结束时间
	 */
	private String useEndTime;
	
	private Date useEndDate;
	
	/**
	 * 状态描述
	 */
	private String statusStr;
	
	/**
	 * 类型描述
	 */
	private String typeStr;
	
	/**
	 * 使用类型描述
	 */
	private String useTypeStr;
	
	/**
	 * 酒券id
	 */
	private long[] wineCouponsIds;
	
	/**
	 * 剩余天数
	 */
	private int remainDays;
	
	/**
	 * 是否已还款
	 */
	private int isRepayment;
	
	/**
	 * 实例化UserwineCouponsModel
	 * 
	 * @param userwineCoupons
	 * @return UserwineCouponsModel
	 */
	public static UserWineCouponsModel instance(UserWineCoupons userWineCoupons) {
		UserWineCouponsModel model = new UserWineCouponsModel();
		BeanUtils.copyProperties(userWineCoupons, model);
		return model;
	}
	
	/**
	 * 根据Model返回UserwineCoupons原型
	 * 
	 * @return UserwineCoupons
	 */
	public UserWineCoupons prototype() {
		UserWineCoupons userWineCoupons = new UserWineCoupons();
		BeanUtils.copyProperties(this, userWineCoupons);
		return userWineCoupons;
	}
	
	/**
	 * 获取当前页数
	 * 
	 * @return 当前页数
	 */
	public int getPage() {
		return page;
	}
	

	/**
	 * 设置当前页数
	 * 
	 * @param page
	 *            当前页数
	 */
	public void setPage(int page) {
		this.page = page;
	}

	/**
	 * 获取每页总数
	 * 
	 * @return 每页总数
	 */
	public int getRows() {
		return rows;
	}

	/**
	 * 设置每页总数
	 * 
	 * @param rows
	 *            每页总数
	 */
	public void setRows(int rows) {
		this.rows = rows;
	}

	/**
	 * 获取搜索条件
	 * 
	 * @return searchName;
	 */
	public String getSearchName() {
		return searchName;
	}

	/**
	 * 设置搜索条件
	 * 
	 * @param searchName
	 */
	public void setSearchName(String searchName) {
		this.searchName = searchName;
	}

	/**
	 * 获取用户Id
	 * 
	 * @return userId
	 */
	public long getUserId() {
		return userId;
	}

	/**
	 * 设置用户Id
	 * 
	 * @param userId
	 */
	public void setUserId(long userId) {
		this.userId = userId;
	}

	/**
	 * 获取用户名
	 * 
	 * @return userName
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * 设置用户名
	 * 
	 * @param userName
	 */
	public void setUserName(String userName) {
		this.userName = userName;
	}

	/**
	 * 获取真实姓名
	 * 
	 * @return realName
	 */
	public String getRealName() {
		return realName;
	}

	/**
	 * 设置真实姓名
	 * 
	 * @param realName
	 */
	public void setRealName(String realName) {
		this.realName = realName;
	}
	
	/**
	 * 获取开始时间
	 * 
	 * @return startTime
	 */
	public String getStartTime() {
		return startTime;
	}

	/**
	 * 设置开始时间
	 * 
	 * @param startTime
	 */
	public void setStartTime(String startTime) {
		this.startTime = startTime;
		this.startDate = DataUtils.toDate(startTime);
	}

	public Date getStartDate() {
		return startDate;
	}

	/**
	 * 获取结束时间
	 * 
	 * @return endTime
	 */
	public String getEndTime() {
		return endTime;
	}

	/**
	 * 设置结束时间
	 * 
	 * @param endTime
	 */
	public void setEndTime(String endTime) {
		this.endTime = endTime;
		this.endDate = DataUtils.toDate(endTime);
	}

	public Date getEndDate() {
		return endDate;
	}

	/**
	 * 获取使用开始时间
	 * 
	 * @return useStartTime
	 */
	public String getUseStartTime() {
		return useStartTime;
	}

	/**
	 * 设置使用开始时间
	 * 
	 * @param useStartTime
	 */
	public void setUseStartTime(String useStartTime) {
		this.useStartTime = useStartTime;
		this.useStartDate = DataUtils.toDate(useStartTime);
	}

	public Date getUseStartDate() {
		return useStartDate;
	}

	/**
	 * 获取使用结束时间
	 * 
	 * @return useEndTime
	 */
	public String getUseEndTime() {
		return useEndTime;
	}

	/**
	 * 设置使用结束时间
	 * 
	 * @param useEndTime
	 */
	public void setUseEndTime(String useEndTime) {
		this.useEndTime = useEndTime;
		this.useEndDate = DataUtils.toDate(useStartTime);
	}

	public Date getUseEndDate() {
		return useEndDate;
	}

	/**
	 * 获取状态描述
	 * 
	 * @return
	 */
	public String getStatusStr() {
		switch (getStatus()) {
		case USER_WINE_COUPONS_STATUS_NO_USE:
			statusStr = "未使用";
			break;
		case USER_WINE_COUPONS_STATUS_USE:
			statusStr = "已使用";
			break;
		case USER_WINE_COUPONS_STATUS_EXPIRED:
			statusStr = "已过期";
			break;
		case USER_WINE_COUPONS_STATUS_INVALID:
			statusStr = "无效";
			break;
		default:
			break;
		}
		return statusStr;
	}

	/**
	 * 设置状态描述
	 * 
	 * @param statusStr
	 */
	public void setStatusStr(String statusStr) {
		this.statusStr = statusStr;
	}

	/**
	 * 获取类型描述
	 * 
	 * @return
	 */
	public String getTypeStr() {
		switch (getType()) {
		case USER_WINE_COUPONS_TYPE_CASH:
			typeStr = "现金酒券";
			break;
		case USER_WINE_COUPONS_TYPE_VIRTUAL:
			typeStr = "虚拟酒券";
			break;
		default:
			break;
		}
		return typeStr;
	}

	/**
	 * 设置类型描述
	 * 
	 * @param typeStr
	 */
	public void setTypeStr(String typeStr) {
		this.typeStr = typeStr;
	}

	public String getUseTypeStr() {
		useTypeStr = getUseType();
		if(StringUtil.isNotBlank(useTypeStr)){
			if (useTypeStr.equals(UserWineCouponsModel.USE_BORROW_TENDER)) {
				useTypeStr = "投资使用";
			}
			if (useTypeStr.equals(UserWineCouponsModel.USE_EXCHANGE_AMOUNT)) {
				useTypeStr = "现金兑换";
			}
		}
		return useTypeStr;
	}

	/**
	 * 设置使用类型描述
	 * 
	 * @param useTypeStr
	 */
	public void setUseTypeStr(String useTypeStr) {
		this.useTypeStr = useTypeStr;
	}

	/**
	 * 获取酒券ID数组
	 * 
	 * @return
	 */
	public long[] getWineCouponsIds() {
		return wineCouponsIds;
	}

	/**
	 * 设置酒券ID数组
	 * 
	 * @param wineCouponsIds
	 */
	public void setWineCouponsIds(long[] wineCouponsIds) {
		this.wineCouponsIds = wineCouponsIds;
	}

	/**
	 * 获取剩余天数
	 * 
	 * @return
	 */
	public int getRemainDays() {
		return remainDays;
	}

	/**
	 * 设置剩余天数
	 * 
	 * @param remainDays
	 */
	public void setRemainDays(int remainDays) {
		this.remainDays = remainDays;
	}
	/**
	 * 检查提交的数据格式
	 *
	 * @return
	 */
	public int validModelData() {
		if (!ValidateUtil.isUserName(getUserName())) {
			throw new UserException(MessageUtil.getMessage("MF102001003"), 1);
		}
		return -1;
	}
	/**
	 * 添加
	 * @return
	 * @throws Exception
	 */
	public BaseGiveAwardModel prototypeForAppend() throws Exception {
		BaseGiveAwardModel model=new BaseGiveAwardModel();
		UserDao userDao = (UserDao) BeanUtil.getBean(UserDao.class);
		User user = userDao.findObjByProperty("userName", getUserName());
		if(user==null)
			throw new UserException("用户不存在");
		model.setUser(user);
		model.setRuleId(getWineCouponsId());
		model.setSourceType(EnumActicityPlanNid.SYSTEM.getValue());
		model.setRuleType(BaseGiveAwardModel.RULE_TYPE_WINE_COUPONS);
		return model;
	}
	
	/**
	 * @return isRepayment
	 */
	public int getIsRepayment() {
		return isRepayment;
	}

	/**
	 * @param isRepayment 要设置的 isRepayment
	 */
	public void setIsRepayment(int isRepayment) {
		this.isRepayment = isRepayment;
	}
}
